CL_SALV_TABLE als Auswahl-Popup
Die Klasse CL_SALV_TABLE ist super für alle Arbeiten rund um Grid-basierte Listen. Der riesengroße Vorteil des CL_SALV_TABLE ist der Umstand, dass man den Feldkatalog nicht selbst ermitteln muss, sondern die anzuzeigende Tabelle einfach der Methode CL_SALV_TABLE=>FACTORY übergeben kann. Das funktioniert selbst mit lokal im Programm definierten internen Tabellen.
Was liegt also näher, um dieses Verfahren auch für die Auswahl von Einträgen aus einer Liste zu verwenden? Um das SALV als Popup anzuzeigen, nutzt du die Methode SET_SCREEN_POPUP. Beim darauffolgenden DISPLAY wird das SALV als Popup angezeigt.
Einschränkungen
Leider hat diese Methode einige Einschränkungen, die es notwendig machen, doch wieder mehr drumherum zu programmieren, als eigentlich notwendig.
- Es gibt keine Abbrechen-Drucktaste
- Es kann kein Wert mit Doppelklick ausgewählt werden
Beiden Funktionen sind jedoch notwendig, um dem Anwendenden einen sinnvollen Dialog zu bieten, um einen Eintrag aus einer Liste auszuwählen.
Es gibt zwei schöne Beispiele in der Codezentrale, die zeigen, dass es möglich ist:
Das erste Beispiel verwendet sehr viel Coding, denn die fehlenden Drucktasten werden umständlich durch eine Toolbar und Splitter-Container realisiert. Die Lösung ist sehr schick und einmal programmiert, kann diese auch wieder verwendet werden.
In der zweiten Lösung, in der der SALV-Table als F4-Suchhilfe verwendet wird, fehlt leider der Doppelklick, um einen Eintrag auszuwählen.
Einfache Lösung
Meine Lösung nutzt die Registrierung des Doppelklick-Events vom SALV-Table und wertet den implizit vorhandenen Abbrechen-Funktionscode aus.
Abbruch
Das SAL-Popup hat zwar keine Abbrechen-Drucktaste, jedoch ist der Funktionscode über die Taste ESC aktiv, so dass der Dialog durch das Drücken der Escape-Taste beendet werden kann.
Der Funktionscode wird in der Systemvariablen SY-UCOMM gespeichert. Alle Funktionscodes der Klasse CL_SALV_TABLE sind in dem Interface IF_SALV_C_FUNCTION verfügbar. Nach Aufruf von salv->display()
kann also SY-UCOMM abgefragt werden. Leider ist nach Drücken der Enter-Taste SY-UCOMM leer, so dass nicht nur if_salv_c_function=>continue
sondern auch SPACE
abgefragt werden müssen.
Doppelklick
Um der anwendenden Person einen Doppelklick zu ermöglichen, registriere ich das Ereignis DOUBLE_CLICK der Klasse CL_SALV_EVENTS_TABLE. Um direkt darauf das Popup auch schließen und die Auswahl bestätigen zu können, rufe ich den Funktionsbaustein SAPGUI_SET_FUNCTIONCODE mit dem Funktionscode für “Continue” auf.
Coding
PARAMETERS p_title TYPE string DEFAULT 'Weekday selection'. PARAMETERS p_item1 TYPE c LENGTH 30 LOWER CASE DEFAULT 'MONMonday'. PARAMETERS p_item2 TYPE c LENGTH 30 LOWER CASE DEFAULT 'TUETuesday'. PARAMETERS p_item3 TYPE c LENGTH 30 LOWER CASE DEFAULT 'WEDWednesday'. PARAMETERS p_item4 TYPE c LENGTH 30 LOWER CASE DEFAULT 'THUThursday'. PARAMETERS p_item5 TYPE c LENGTH 30 LOWER CASE DEFAULT 'FRIFriday'. PARAMETERS p_item6 TYPE c LENGTH 30 LOWER CASE DEFAULT 'SATSaturday'. PARAMETERS p_item7 TYPE c LENGTH 30 LOWER CASE DEFAULT 'SUNSunday'. CLASS cancelled DEFINITION INHERITING FROM cx_static_check. ENDCLASS. CLASS main DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF _item, key TYPE c LENGTH 3, value TYPE c LENGTH 20, END OF _item, _items TYPE STANDARD TABLE OF _item WITH DEFAULT KEY. METHODS set_items IMPORTING items TYPE _items. METHODS ask IMPORTING title TYPE clike RETURNING VALUE(result) TYPE _item RAISING cancelled. PRIVATE SECTION. DATA salv_popup TYPE REF TO cl_salv_table. DATA items TYPE _items. METHODS: on_double_click FOR EVENT double_click OF cl_salv_events_table IMPORTING row column sender. ENDCLASS. CLASS main IMPLEMENTATION. METHOD set_items. me->items = items. ENDMETHOD. METHOD on_double_click. DATA(selections) = salv_popup->get_selections( ). selections->set_selected_rows( VALUE #( ( row ) ) ). * cl_gui_cfw=>set_new_ok_code( if_salv_c_function=>continue ). CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE' EXPORTING functioncode = if_salv_c_function=>continue. ENDMETHOD. METHOD ask. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = salv_popup CHANGING t_table = items ). DATA(display) = salv_popup->get_display_settings( ). display->set_list_header( CONV #( title ) ). DATA(selections) = salv_popup->get_selections( ). selections->set_selection_mode( if_salv_c_selection_mode=>single ). selections->set_selected_rows( VALUE #( ( 1 ) ) ). DATA(columns) = salv_popup->get_columns( ). columns->set_optimize( abap_true ). salv_popup->set_screen_popup( start_column = 10 end_column = 30 start_line = 10 end_line = 17 ). SET HANDLER on_double_click FOR salv_popup->get_event( ). salv_popup->display( ). CASE sy-ucomm. WHEN space OR if_salv_c_function=>continue. DATA(selected_rows) = selections->get_selected_rows( ). DATA(selected_row) = selected_rows[ 1 ]. result = items[ selected_row ]. WHEN if_salv_c_function=>cancel. RAISE EXCEPTION TYPE cancelled. ENDCASE. CATCH cx_salv_msg INTO DATA(error). MESSAGE error TYPE 'I'. ENDTRY. ENDMETHOD. ENDCLASS. INITIALIZATION. DATA(my_popup) = NEW main( ). AT SELECTION-SCREEN. my_popup->set_items( VALUE #( ( key = p_item1(3) value = p_item1+3(20) ) ( key = p_item2(3) value = p_item2+3(20) ) ( key = p_item3(3) value = p_item3+3(20) ) ( key = p_item4(3) value = p_item4+3(20) ) ( key = p_item5(3) value = p_item5+3(20) ) ( key = p_item6(3) value = p_item6+3(20) ) ( key = p_item7(3) value = p_item7+3(20) ) ) ). TRY. DATA(selected_entry) = my_popup->ask( p_title ). MESSAGE |you selected { selected_entry-value }| TYPE 'I'. CATCH cancelled. MESSAGE 'you cancelled the selection' TYPE 'I'. ENDTRY.
- Meine Eclipse-Plugins - 22. November 2024
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024